<?php
	// Classe permettant d'automatiser un ensemble de requêtes et de générer automatiquement la réponse XML adaptée à l'opération demandée
	class DB2XML{
		// $ALL est le tableau contenant toutes les requêtes;
		// $TYPES permet de savoir de quelle table la réponse est extraite
		// $state permet de savoir si	0 : on ne sait pas quelles seront les requêtes
		//								1 : les requêtes seront de type ASK
		//								2 : les requêtes seront de type SAVE
		var $ALL,$TYPES,$state;
		
		public function __construct(){
			$this->ALL = array();
			$this->TYPES = array();
			$this->state = 0;
		}
		
		// Méthode permettant d'ajouter une requête sous la même forme qu'avec l'objet "requests"
		// $WHAT : selon s'il s'agit d'un "ASK" ou d'un "SAVE", voir le cas correspondant dans "requests.php"
		// $FROM : selon s'il s'agit d'un "ASK" ou d'un "SAVE" (correspond à $TABLE), voir le cas correspondant dans "requests.php"
		// $WHERE : selon s'il s'agit d'un "ASK" ou d'un "SAVE", voir le cas correspondant dans "requests.php"
		// $ORDER : voir "ASK" dans "requests.php"
		public function addRequest($WHAT,$FROM,$WHERE = NULL,$ORDER = NULL){
			if($this->state == 0){
				if(is_array($WHAT)) $this->state = 2;
				else $this->state = 1;
			}
			
			$this->TYPES[] = $FROM;
			
			if($this->state == 1) $this->ALL[] = requests::ASK($WHAT,$FROM,$WHERE,$ORDER);
			else $this->ALL[] = requests::SAVE($WHAT,$FROM,$WHERE);
		}
		
		// Méthode permettant d'ajouter une requête propre à un individu sous la même forme qu'avec l'objet "requests"
		// $TYPE : type à signaler dans le code XML généré à la fin
		// $WHAT,$FROM,$WHERE,$ORDER : pareil que pour addRequest
		// return : le dernier élément ajouté à la liste des résultats de requêtes : le résultat de la requête qui vient d'être donnée
		public function addIndividuRequest($TYPE,$WHAT,$FROM,$WHERE = NULL,$ORDER = NULL){
			if($this->state == 0){
				if(is_array($WHAT)) $this->state = 2;
				else $this->state = 1;
			}
			
			$this->TYPES[] = $TYPE;
			
			if($this->state == 1) $this->ALL[] = requests::ASK($WHAT,$FROM,$WHERE,$ORDER);
			else $this->ALL[] = requests::SAVE($WHAT,$FROM,$WHERE);
			
			return end($this->ALL);
		}
		
		// Méthode permettant d'obtenir le code XML des requêtes effectuées avant en fonction de leur type
		// $NODE : node principal auquel ajouter le résultat
		// $DOC : document XML final utilisé pour créer des nodes
		// return : code XML des requêtes effectuées avant
		public function XMLize($NODE,$DOC){
			if($this->state == 0) return NULL;
			if($this->state == 1) return $this->ASKXML($NODE,$DOC);
			return $this->SAVEXML($NODE,$DOC);
		}
		
		// Méthode permettant d'obtenir le code XML des requêtes effectuées avant pour des requêtes de type "ASK"
		// $NODE : node principal auquel ajouter le résultat
		// $DOC : document XML final utilisé pour créer des nodes
		// return : code XML des requêtes effectuées avant
		private function ASKXML($NODE,$DOC){
			foreach($this->ALL[0][0] as $col => $value){ // CHAQUE CHAMP DE LA LIGNE
				$property = $DOC->createElement("property");
				$property->appendChild($DOC->createElement("name",$col));
				$property->appendChild($DOC->createElement("value",$value));
				$NODE->appendChild($property);
			}
			unset($this->ALL[0]);
			unset($this->TYPES[0]);
			
			$foreigners = $DOC->createElement("foreigners");
			foreach($this->ALL as $num => $element){ // ELEMENT et FOREIGNERS
				foreach($element as $tab){ // CHAQUE LIGNE CORRESPONDANT A LA RECHERCHE
					$foreigner = $DOC->createElement("foreign");
					$foreigner->setAttribute("type",$this->TYPES[$num]);
					foreach($tab as $col => $value){ // CHAQUE CHAMP DE LA LIGNE
						$property = $DOC->createElement("property");
						$property->appendChild($DOC->createElement("name",$col));
						$property->appendChild($DOC->createElement("value",$value));
						$foreigner->appendChild($property);
					}
					$foreigners->appendChild($foreigner);
				}
			}
			
			if(isset($num)) $NODE->appendChild($foreigners);
			return $NODE;
		}
		
		// Méthode permettant d'obtenir le code XML des requêtes effectuées avant pour des requêtes de type "SAVE"
		// $NODE : node principal auquel ajouter le résultat
		// $DOC : document XML final utilisé pour créer des nodes
		// return : code XML des requêtes effectuées avant
		// Note : le noeud est vide puisque aucun retour n'est attendu et qu'aucune erreur n'est retournée
		private function SAVEXML($NODE,$DOC){
			
			return $NODE;
		}
	}

?>
